package br.com.sisat.persistencia.DAO;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import br.com.sisat.modelo.PacienteDTO;
import br.com.sisat.persistencia.conexao.ConnectionProvider;
import br.com.sisat.util.ObjectUtil;


public class PacienteDAO {

	private static PacienteDAO dao;
	
	public static PacienteDAO getInstance(){
		if(ObjectUtil.isEmpty(dao)){
			dao = new PacienteDAO();
		}
		return dao;
	}
	
	
	private void preecherPK (PacienteDTO paciente, Connection conn)throws Exception{
	
		String sql = "select nextval ('sat.pessoa_id_pessoa_seq_1')";
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		rs.next();
		paciente.setIdPessoa(rs.getLong(1));
	}
	
	public Long incluir(PacienteDTO paciente, Connection conn) throws Exception{
	
		String sql = "INSERT INTO sat.pessoa " +
		"(id_pessoa, nome, cpf, endereco, bairro, municipio, uf, cep, telefone, celular, rg, " +
		"sexo, profissao, datanascimento, estadocivil) " +
		"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ";
		
		PreparedStatement ps = conn.prepareStatement(sql);
		int index = 1;
		preecherPK(paciente, conn);
		ps.setLong 		(index++, paciente.getIdPessoa());
		ps.setString	(index++, paciente.getNoPaciente());
		ps.setString	(index++, paciente.getDeCPF());
		ps.setString 	(index++, paciente.getDeEndereco());
		ps.setString 	(index++, paciente.getDeBairro());
		ps.setString 	(index++, paciente.getDeMunicipio());
		ps.setString 	(index++, paciente.getDeUF());
		ps.setString 	(index++, paciente.getDeCEP());
		ps.setString 	(index++, paciente.getDeTelResid());
		ps.setString 	(index++, paciente.getDeTelCelular());
		ps.setString 	(index++, paciente.getDeRG());
		ps.setString 	(index++, paciente.getDeSexo());
		ps.setString 	(index++, paciente.getDeProfissao());
		ps.setDate		(index++, paciente.getDtNascimento());
		ps.setString 	(index++, paciente.getDeEstadoCivil());
		
		ps.executeUpdate();
		conn.commit();
		return paciente.getIdPessoa();		
	}
	
	
	public Long alterar(PacienteDTO paciente, Connection conn) throws Exception{		
	
		String sql = "UPDATE sat.pessoa " +
		"SET nome = ?, cpf = ?, endereco = ?, bairro = ?, municipio = ?, " +
		"uf = ?, cep = ?, telefone = ?, celular = ?, rg = ?, sexo = ?, profissao = ?, " + 
		"datanascimento = ?, estadocivil = ? " +
		"WHERE id_pessoa = " + paciente.getIdPessoa().toString();
		
		PreparedStatement ps = conn.prepareStatement(sql);
		int index = 1;
		ps.setString(index++, paciente.getNoPaciente());
		ps.setString(index++, paciente.getDeCPF());
		ps.setString(index++, paciente.getDeEndereco());
		ps.setString(index++, paciente.getDeBairro());
		ps.setString(index++, paciente.getDeMunicipio());
		ps.setString(index++, paciente.getDeUF());
		ps.setString(index++, paciente.getDeCEP());
		ps.setString(index++, paciente.getDeTelResid());
		ps.setString(index++, paciente.getDeTelCelular());
		ps.setString(index++, paciente.getDeRG());
		ps.setString(index++, paciente.getDeSexo());
		ps.setString(index++, paciente.getDeProfissao());
		ps.setDate	(index++, paciente.getDtNascimento());
		ps.setString(index++, paciente.getDeEstadoCivil());

		ps.executeUpdate();
		conn.commit();
		ps.close();
		return paciente.getIdPessoa();
	}
	
	
	public void excluir(PacienteDTO paciente) throws Exception{		
		String sql = "DELETE FROM sat.pessoa WHERE id_pessoa = " + paciente.getIdPessoa().toString();
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.executeUpdate();
		conn.commit();
		ps.close();
	}
	
	
	public List<PacienteDTO> verificaDependencia (PacienteDTO paciente) throws Exception{
		Connection conn = ConnectionProvider.getDefaultConnection();
		List<PacienteDTO> dependenciaPacientes = new ArrayList<PacienteDTO>();
		String sql = "SELECT id_pessoa from sat.consulta WHERE id_pessoa = " 
		+ paciente.getIdPessoa().toString();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while (rs.next()){
			PacienteDTO pacResultado = new PacienteDTO();
			pacResultado.setIdPessoa(rs.getLong("id_pessoa"));
			dependenciaPacientes.add(pacResultado);
		}
		return dependenciaPacientes;
	}
		
	public List<PacienteDTO> consultar(PacienteDTO paciente) throws Exception {
		List<PacienteDTO> pacientes = new ArrayList<PacienteDTO>();
		String sql = "SELECT paciente.id_pessoa, paciente.nome, paciente.cpf, paciente.endereco, " +
					 "paciente.bairro, paciente.municipio, paciente.uf, paciente.cep, paciente.telefone, " +
					 "paciente.celular, paciente.rg, paciente.sexo, paciente.profissao, " +
					 "paciente.estadoCivil, paciente.dataNascimento " +
					 "FROM sat.pessoa paciente " +
					 "where  paciente.id_pessoa not in  (SELECT ID_PESSOA FROM SAT.TERAPEUTA) ";
						
		if(!ObjectUtil.isEmpty(paciente.getIdPessoa()) && paciente.getIdPessoa() != 0){
			sql =  sql + " and paciente.id_pessoa = " + paciente.getIdPessoa().toString();
		}
		if(!ObjectUtil.isEmpty(paciente.getNoPaciente())){
			sql =  sql + " and upper(paciente.nome) LIKE  upper('" + paciente.getNoPaciente().toString().toUpperCase() + "%')";
		}
		if(!ObjectUtil.isEmpty(paciente.getDtNascimento())){
			sql =  sql + " and paciente.dataNascimento = '" + paciente.getDtNascimento() + "'";
		}
		if(!ObjectUtil.isEmpty(paciente.getDeTelCelular())){
			sql =  sql + " and paciente.celular = '" + paciente.getDeTelCelular().toString() + "'";
		}
		if(!ObjectUtil.isEmpty(paciente.getDeCPF())){
			sql =  sql + " and paciente.cpf = '" + paciente.getDeCPF().toString() + "'";
		}
		if(!ObjectUtil.isEmpty(paciente.getDeRG())){
			sql =  sql + " and paciente.rg = '" + paciente.getDeRG().toString() + "'";
		}
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			PacienteDTO pac = new PacienteDTO();
			pac.setIdPessoa		(rs.getLong("id_pessoa"));
			pac.setNoPaciente	(rs.getString("nome"));
			pac.setDeCPF		(rs.getString("cpf"));
			pac.setDeEndereco	(rs.getString("endereco"));
			pac.setDeBairro		(rs.getString("bairro"));
			pac.setDeMunicipio	(rs.getString("municipio"));
			pac.setDeUF			(rs.getString("uf"));
			pac.setDeCEP		(rs.getString("cep"));
			pac.setDeTelResid	(rs.getString("telefone"));
			pac.setDeTelCelular	(rs.getString("celular"));
			pac.setDeRG			(rs.getString("rg"));
			pac.setDeSexo		(rs.getString("sexo"));
			pac.setDeProfissao	(rs.getString("profissao"));
			pac.setDeEstadoCivil(rs.getString("estadoCivil"));
			pac.setDtNascimento	(rs.getDate("dataNascimento"));
			pacientes.add(pac);
		}
		return pacientes;
	}


	public int verificaExistenciaCPF(String deCPF) throws Exception{
		String sql = "SELECT COUNT(*) AS TOTAL FROM SAT.PESSOA WHERE cpf = ?";
		Connection conn = ConnectionProvider.getDefaultConnection();
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.setString(1, deCPF);
		ResultSet rs = ps.executeQuery();
		rs.next();
		return rs.getInt("total");
	}
}
